day09c (重ね合わせ処理の高速化)
マウスしか表示されなくなってしまった
layerは問題なさそう?
WindowWriter::Write()を変えてなかった(window_.Atに代入するやつのままだった)
マウスカーソルは透明色があるから処理が変わるから、これだけ表示されてたのかも
どう考えても早くなったんだけど、なんで早くなったのかわからないし、タイマーの値がほとんど変化しない
タイマーが測るのは単純な描画速度であって、時間がかかっているのはprintkによるスクロールの部分だからでは?
Writeがどこで呼ばれてるのか整理する必要がありそう
フレームバッファを「見えるスクリーン」、シャドウバッファを「見えないスクリーン」として考える(ちょっと違いそうだけど)
main.cpp:274から
まずデスクトップのウィンドウを作成します
そのウィンドウのWindowWriterをDrawDesktop()に渡します
DrawDesktopでは、FillRectangleがWindowWriter.Write()を使って書き込みます
このとき、シャドウバッファとウィンドウのフレームバッファ両方に書き込まれる
layer_manager->Draw()が呼ばれます
LayerManager::Draw()はLayer::DrawTo()を呼び、それはWindow::DrawTo()を呼びます
デスクトップのウィンドウには透明色がないので、シャドウバッファをコピーします
今までだと、forで1ピクセルずつフレームバッファに書いてた
Windowクラスで、Writeはウィンドウの中身を変えて、DrawToはウィンドウの中身をフレームバッファに書き込む
ウィンドウの中身を変える(Write:DrawDesktopで呼ばれる)→変えた結果を反映したいので、フレームバッファを更新、このときに見えないシャドウバッファにも書き込む
ウィンドウの中身を変えない(LayerManagerから呼ばれるDrawTo)→シャドウバッファをコピーするだけでOK
フレームバッファは共通だけど、シャドウバッファは各ウィンドウだけ持つことができる
https://scrapbox.io/files/6213b31e326f2d0022eb2b22.png
https://scrapbox.io/files/6213b2ebd857c200205c4da7.png
まあわかった気がする 結局本に書いてある図のとおりだったということですね